package com.code.origin.utils.json;

import com.code.origin.utils.string.StringUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.HashMap;

public class GsonUtils {

	//线程安全的
    private static final Gson GSONDEFAULT;
    static{
    	GSONDEFAULT = new GsonBuilder()     
//                .excludeFieldsWithoutExposeAnnotation()//打开Export注解，但打开了这个注解,副作用，要转换和不转换都要加注解
//              .serializeNulls()  //是否序列化空值 
                .setDateFormat("yyyy-MM-dd HH:mm:ss")//序列化日期格式  "yyyy-MM-dd"
//              .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写
//                .setPrettyPrinting() //自动格式化换行
//              .setVersion(1.0)  //需要结合注解使用，有的字段在1。0的版本的时候解析，但0。1版本不解析
                .create();
    }
    
    public static String getJsonStringValue(String body, String key) {
    	JsonElement eles = getJsonElement(body);
		String jer = eles.getAsJsonObject().get(key).getAsString();
		return jer;
    }
    
    public static HashMap<String, String> getJson2Map(String json) {
    	if (StringUtils.isEmpty(json)) {
    		return new HashMap<String, String>();
    	}
    	Type tt = new TypeToken<HashMap<String, String>>(){}.getType();
    	return fromJson(json, tt);
    }
    
    public static JsonElement getJsonElement(String jsonString) {
    	return new JsonParser().parse(jsonString);
    }

    //获取默认gson解析器
    public static Gson getGsonDefault(){
        return GSONDEFAULT;
    }

    //对象转换为json
    public static String toJson(Object object){
        return toJson(GSONDEFAULT, object);
    }

    /**JSON转换为对象1--普通类型*/
    public static <T> T fromJson(String json, Class<T> classOfT){
        return fromJson(GSONDEFAULT, json, classOfT);
    }
    /**JSON转换为对象-针对泛型的类型*/
    public static <T> T fromJson(String json, Type typeOfT){
        return fromJson(GSONDEFAULT, json, typeOfT);
    }
    
    /**JsonElement转换为对象-针对泛型的类型*/
    public static <T> T fromJson(JsonElement json, Type typeOfT) {
    	return GSONDEFAULT.fromJson(json, typeOfT);
    }

    /**使用自己构建的Gson，对对象转换为json*/
    public static String toJson(Gson gsonStyle, Object object){
        return gsonStyle.toJson(object);
    }

    /**使用自己构建的Gson，对JSON转换为对象1--普通类型*/
    public static <T> T fromJson(Gson gsonStyle,String json, Class<T> classOfT){
        return gsonStyle.fromJson(json, classOfT);
    }
    /**使用自己构建的Gson，对JSON转换为对象-针对泛型的类型*/
    public static <T> T fromJson(Gson gsonStyle,String json, Type typeOfT){
        return gsonStyle.fromJson(json, typeOfT);
    }

}